package mysql8学习.高级.第04章_逻辑架构;

/**
 * MySQL拿到一个查询请求后，会先到查询缓存看看，之前是不是执行过这条语句。
 * 之前执行过的语 句及其结果可能会以key-value对的形式，被直按缓存在内存中。
 * key 是查询的语句，value 是查询的结果。
 * 如果你的查询能够直接在这个缓存中找到key,那么这个value就会被直接返回给客户端。
 * 如果语句不在查询缓存中，就会继续后面的执行阶段。
 * 执行完成后， 执行结果会被存入查询缓存中。
 * 所以，如果查询命中缓存，MySQL 不需要执行后面的复杂操作，就可以直接返回结果，这个效率会很高。
 *
 * 查询缓存是提前把查询结果缓存起来,这样下次不需要执行就可以直接拿到结果。
 * 需要说明的是，在MYSQL中的查询缓存，不是缓存查询计划，而是查询对应的结果。
 * 这就意味着查询匹配的鲁棒性大大降低，只有相同的查询操作才会命中查询缓存。
 * 两个查询请求在任何字符上的不同(例如:空格、注释、大小写)， 都会导致缓存不会命中。
 * 因此MySQL的查询缓存命中率不高。
 * 同时，如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表，
 * 如mysql、information_schema、 performance_schema数据库中的表，那这个请求就不会被缓存。
 * 以某些系统函数举例，可能同样的函数的两次调用会产生不一样的结果，
 * 比如函数NOW，每次调用都会产生最新的当前时间，如果在一个查询请求中调用了这个函数，那即使查询请求的文本信息都一样，
 * 那不同时间的两次查询也应该得到不同的结果，
 * 如果在第一次查询时就缓存了，那第二次查询的时候直接使用第一次查询的结果就是错误的!
 *
 *
 * 此外，既然是缓存,那就有它缓存失效的时候。
 * MySQL的缓存系统会监测涉及到的每张表，只要该表的结构或者数据被修改，
 * 如对该表使用了
 * INSERT、UPDATE、 DELETE、 TRUNCATE TABLE、ALTER TABLE、DROP、TABLE或DROP DATABASE 语句，
 * 那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除!
 * 对于更新压力大的数据库来说，查询缓存的命中率会非常低。
 *
 */
public class C1_SQL缓存弊端 {
}
